package com.dyw.Day20;

/**
 * @author Devil
 * @create 2022-01-29-23:29
 *
 *
 * 给你两个按 非递减顺序 排列的整数数组nums1 和 nums2，另有两个整数 m 和 n ，分别表示 nums1 和 nums2 中的元素数目。
 *
 * 请你 合并 nums2 到 nums1 中，使合并后的数组同样按 非递减顺序 排列。
 *
 * 注意：最终，合并后数组不应由函数返回，而是存储在数组 nums1 中。为了应对这种情况，nums1 的初始长度为 m + n，其中前 m 个元素表示应合并的元素，后 n 个元素为 0 ，应忽略。nums2 的长度为 n 。
 *
 * 思路: 线性表归并排序 借用辅助数组合并 最后将辅助数组的数组复制到nums1中
 */
public class Demo01 {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        //创建辅助数组
        int[] ints = new int[m + n];
        //归并排序
        int i = 0;
        int j = 0;
        int k = 0;
        while (i < m && j < n) {
            if (nums1[i] <= nums2[j]) {
                ints[k++] = nums1[i++];
            } else {
                ints[k++] = nums2[j++];
            }
        }
        for (; i < m; i++) {
            ints[k++] = nums1[i];
        }
        for (; j < n; j++) {
            ints[k++] = nums2[j];
        }
        if (k >= 0) {
            //将辅助数组中的数据copy到nums1中
            System.arraycopy(ints, 0, nums1, 0, k);
        }
    }
}
